package com.exartisan.yn_event;

import java.text.SimpleDateFormat;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnPreparedListener;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageButton;
import android.widget.MediaController;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
import android.widget.VideoView;
import com.exartisan.yn_event.util.SystemUiHider;

/**
 * An example full-screen activity that shows and hides the system UI (i.e.
 * status bar and navigation/system bar) with user interaction.
 * 
 * @see SystemUiHider
 */
public class VideoActivity extends Activity {
	/**
	 * Whether or not the system UI should be auto-hidden after
	 * {@link #AUTO_HIDE_DELAY_MILLIS} milliseconds.
	 */
	private static final boolean AUTO_HIDE = true;

	/**
	 * If {@link #AUTO_HIDE} is set, the number of milliseconds to wait after
	 * user interaction before hiding the system UI.
	 */
	private static final int AUTO_HIDE_DELAY_MILLIS = 3000;

	/**
	 * If set, will toggle the system UI visibility upon interaction. Otherwise,
	 * will show the system UI visibility upon interaction.
	 */
	private static final boolean TOGGLE_ON_CLICK = true;

	/**
	 * The flags to pass to {@link SystemUiHider#getInstance}.
	 */
	private static final int HIDER_FLAGS = SystemUiHider.FLAG_HIDE_NAVIGATION;

	/**
	 * The instance of the {@link SystemUiHider} for this activity.
	 */
	private SystemUiHider mSystemUiHider;

	private static boolean isPaused = false;
	private VideoView video;
	private SeekBar seekBar;
	private TextView tvDuration;
	private TextView tvCurrentProgress;
	private ImageButton btnPause;
	private Handler mHandler = new Handler();
	private Runnable onEverySecond = new Runnable() {

		@Override
		public void run() {

			if (seekBar != null && video.isPlaying()) {
				int progress = video.getCurrentPosition();
				seekBar.setProgress(progress);
				tvCurrentProgress.setText(convertToTime(progress));
			}
		}
	};

	@SuppressLint("NewApi") @Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		setContentView(R.layout.activity_video);
		
		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) getActionBar().hide();

		final View controlsView = findViewById(R.id.fullscreen_content_controls);
		final View contentView = findViewById(R.id.fullscreen_content);
		final View mediaView = findViewById(R.id.media_controls);
		btnPause = (ImageButton) findViewById(R.id.btnPause);
		tvCurrentProgress = (TextView) findViewById(R.id.tvCurrentProgess);
		tvDuration = (TextView) findViewById(R.id.tvDuration);

		seekBar = (SeekBar) findViewById(R.id.seekBar);
//		MediaController mc = new MediaController(this);
		video = (VideoView) findViewById(R.id.video);
		Uri videoPath = Uri.parse("android.resource://" + getPackageName()
				+ "/" + R.raw.big_buck_bunny);
//		Uri videoPath = Uri.parse("http://clips.vorwaerts-gmbh.de/VfE_html5.mp4");
//		mc.setAnchorView(video);
		video.setVideoURI(videoPath);
//		video.setMediaController(mc);
		video.requestFocus();
		video.start();
		seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

			@Override
			public void onStopTrackingTouch(SeekBar seekBar) {
			}

			@Override
			public void onStartTrackingTouch(SeekBar seekBar) {
			}

			@Override
			public void onProgressChanged(SeekBar seekBar, int progress,
					boolean fromUser) {

				if (fromUser) {
					// this is when actually seekbar has been seeked to a new
					// position
					if(video.isPlaying()==false) video.start();
					video.seekTo(progress);
					tvCurrentProgress.setText(convertToTime(progress));
				}
			}
		});
		video.setOnPreparedListener(new OnPreparedListener() {

			@Override
			public void onPrepared(MediaPlayer mp) {
				int duration =video.getDuration();
				seekBar.setMax(duration);
				tvDuration.setText(convertToTime(duration));
//				seekBar.postDelayed(onEverySecond, 1000);
				Thread thread = new Thread(new Runnable() {
					
					@Override
					public void run() {
						while (true) {
							try {
								Thread.sleep(1000);
								mHandler.post(onEverySecond);	
							} catch (InterruptedException e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							}
							
						}
						
					}
				});
				thread.start();
			}
		});

		btnPause.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				int progress = video.getCurrentPosition();
				if (video.isPlaying()) {			
					video.pause();
					btnPause.setImageResource(R.drawable.ic_play);
				} else {
					btnPause.setImageResource(R.drawable.ic_pause);
					video.start();
					video.seekTo(progress);
				}
			}
		});
		
		// Set up an instance of SystemUiHider to control the system UI for
		// this activity.
		mSystemUiHider = SystemUiHider.getInstance(this, contentView,
				HIDER_FLAGS);
		mSystemUiHider.setup();
		mSystemUiHider
				.setOnVisibilityChangeListener(new SystemUiHider.OnVisibilityChangeListener() {
					// Cached values.
					int mControlsHeight;
					int mShortAnimTime;

					@Override
					@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
					public void onVisibilityChange(boolean visible) {
						if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
							// If the ViewPropertyAnimator API is available
							// (Honeycomb MR2 and later), use it to animate the
							// in-layout UI controls at the bottom of the
							// screen.
							if (mControlsHeight == 0) {
								mControlsHeight = controlsView.getHeight();
							}
							if (mShortAnimTime == 0) {
								mShortAnimTime = getResources().getInteger(
										android.R.integer.config_shortAnimTime);
							}
							controlsView.setVisibility(visible ? View.VISIBLE
									: View.GONE);
							mediaView.animate()
							.translationY(visible ? 0 : mControlsHeight)
							.setDuration(mShortAnimTime);
							btnPause.setVisibility(visible ? View.VISIBLE
									: View.GONE);
						} else {
							// If the ViewPropertyAnimator APIs aren't
							// available, simply show or hide the in-layout UI
							// controls.
							controlsView.setVisibility(visible ? View.VISIBLE
									: View.GONE);
							mediaView.setVisibility(visible ? View.VISIBLE
									: View.GONE);
							btnPause.setVisibility(visible ? View.VISIBLE
									: View.GONE);
						}

						if (visible && AUTO_HIDE) {
							// Schedule a hide().
							delayedHide(AUTO_HIDE_DELAY_MILLIS);
						}
					}
				});

		// Set up the user interaction to manually show or hide the system UI.
		contentView.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View view) {
				if (TOGGLE_ON_CLICK) {
					mSystemUiHider.toggle(1);
				} else {
					mSystemUiHider.show(1);
				}
			}
		});

		// Upon interacting with UI controls, delay any scheduled hide()
		// operations to prevent the jarring behavior of controls going away
		// while interacting with the UI.
		// findViewById(R.id.dummy_button).setOnTouchListener(
		// mDelayHideTouchListener);
	}

	@Override
	protected void onPostCreate(Bundle savedInstanceState) {
		super.onPostCreate(savedInstanceState);

		// Trigger the initial hide() shortly after the activity has been
		// created, to briefly hint to the user that UI controls
		// are available.
		delayedHide(100);
	}

	/**
	 * Touch listener to use for in-layout UI controls to delay hiding the
	 * system UI. This is to prevent the jarring behavior of controls going away
	 * while interacting with activity UI.
	 */
	View.OnTouchListener mDelayHideTouchListener = new View.OnTouchListener() {
		@Override
		public boolean onTouch(View view, MotionEvent motionEvent) {
			if (AUTO_HIDE) {
				delayedHide(AUTO_HIDE_DELAY_MILLIS);
			}
			return false;
		}
	};

	Handler mHideHandler = new Handler();
	Runnable mHideRunnable = new Runnable() {
		@Override
		public void run() {
			mSystemUiHider.hide();
		}
	};

	/**
	 * Schedules a call to hide() in [delay] milliseconds, canceling any
	 * previously scheduled calls.
	 */
	private void delayedHide(int delayMillis) {
		mHideHandler.removeCallbacks(mHideRunnable);
		mHideHandler.postDelayed(mHideRunnable, delayMillis);
	}
	
	private String convertToTime(int milisecond) {
		if (milisecond / 3600000 == 0)
			return new SimpleDateFormat("mm:ss").format(milisecond);
		else
			return new SimpleDateFormat("HH:mm:ss").format(milisecond);
	}
}
